/*
 * Copyright 2010 Pierre Heinzerling, Uwe Janner, Patrick Wright
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.upp.publinksky.operations.link;

import com.upp.publinksky.dao.LinkCommentDAO;
import com.upp.publinksky.dao.LinkDAO;
import com.upp.publinksky.dao.ThemeDAO;
import com.upp.publinksky.dto.LinkInfo;
import com.upp.publinksky.model.Link;
import com.upp.publinksky.model.LinkComment;
import com.upp.publinksky.model.Theme;
import com.upp.publinksky.operations.util.ThemeLookup;
import com.upp.publinksky.util.JsonConversion;
import com.upp.publinksky.util.PMF;
import com.upp.publinksky.util.UserUtil;

import javax.jdo.PersistenceManager;
import javax.ws.rs.Consumes;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.logging.Logger;

@SuppressWarnings({"unchecked"})
@Path("/link/submit")
public class LinkSubmit {
    private static final Logger log = Logger.getLogger(LinkSubmit.class.getName());

    @PUT
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response submitItem(final LinkInfo ls) {
        final String email = UserUtil.getCurrentUserEmail();
        PersistenceManager pm = PMF.get().getPersistenceManager();

        try {
            Theme theme = ThemeLookup.checkedGetTheme(ls.getThemeId(), pm);
            ThemeDAO.markUpdatedBy(theme, email, pm);

            Link link = LinkDAO.getLinkByThemeAndUri(theme, ls.getUriString(), pm);
            if (link == null) {
                return addLink(theme, ls, email, pm);
            } else {
                return addOrUpdateLinkComment(theme, ls, email, link, pm);
            }
        } finally {
            pm.close();
        }
    }

    private Response addLink(final Theme theme, final LinkInfo ls, final String email, final PersistenceManager pm) {
        final Link link = LinkDAO.insertLink(theme, email, ls.getTitle(), ls.getUriString(), pm);
        LinkCommentDAO.insertComment(theme.getKey(), email, ls.getUriString(), ls.getNote(), theme.getLastUpdateCounter(), pm);
        return Response.ok(JsonConversion.toJson(link), MediaType.APPLICATION_JSON_TYPE).build();
    }

    private Response addOrUpdateLinkComment(final Theme theme, final LinkInfo ls, final String email, final Link link, final PersistenceManager pm) {
        // if score was 0 a user wants it back
        if (link.getScore() == 0) {
            LinkDAO.restoreLink(link, pm);
        }

        // see if there is already a comment by this user
        LinkComment lc = LinkCommentDAO.getLinkCommentByUriAndEmail(email, ls.getUriString(), pm);
        if (lc == null) {
            // add comment by this user
            LinkCommentDAO.insertComment(theme.getKey(), email, ls.getUriString(), ls.getNote(), theme.getLastUpdateCounter(), pm);
        } else {
            // update existing comment
            LinkCommentDAO.updateLinkComment(lc, ls.getNote(), theme.getLastUpdateCounter(), pm);
        }
        return Response.ok(JsonConversion.toJson(link), MediaType.APPLICATION_JSON_TYPE).build();
    }
}